package reflect;

import java.lang.reflect.Method;

/**
 * 关于getMethods,以及getDeclaredMethods方法的区别
 *
 * getMethods是获取类对象的所有公开的成员函数,包含继承自超类的
 * getDeclaredMethods是获取类对象的所有的成员函数，不包含继承自超类的.
 * 即，Declared是本类的所有方法！

 * 暴力反射：
 * method.setAccessible(true);
 * 在getDeclaredMethod获取方法method后，开启暴力反射，可以打开访问权限，可以获取到私有的成员函数
 *
 * method.setAccessible(false);
 * 一般用完要关上
 */
public class ReflectDemo6 {
    public static void main(String[] args) throws Exception{
        //正常情况，我们调用一个类的私有方法是不行的
        //Person p = new Person();
        //p.hehe();  //编译报错

        Class cls = Class.forName("reflect.Person");
        Object o = cls.newInstance();
        Method[] methods = cls.getMethods();
        for(Method method : methods) {
            System.out.println(method.getName());
        }

        System.out.println("---------------------------------");

        Method[] declaredMethods = cls.getDeclaredMethods();
        for(Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod.getName());
        }

        //Method me = cls.getMethod("hehe"); //运行报错
        Method me = cls.getDeclaredMethod("hehe");
        //me.invoke(o);
        //上句运行编译报错，因为Declared只能访问到，没有权限invoke调用
        //开启暴力反射权限：
        me.setAccessible(true);
        me.invoke(o);
        me.setAccessible(false);
    }
}
